package com.bookocean.infrastructure.persistence.repository;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.bookocean.controller.dto.UserInfoDto;
import com.bookocean.domain.repository.UserRepository;
import com.bookocean.infrastructure.persistence.mapper.UserInfoMapper;
import com.bookocean.infrastructure.persistence.po.UserInfoPO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;

/**
 * 用户仓储实现类
 * 
 * @author BookOcean
 * @since 2024-01-01
 */
@Slf4j
@Repository
@RequiredArgsConstructor
public class UserRepositoryImpl implements UserRepository {

    private final UserInfoMapper userInfoMapper;

    @Override
    public UserInfoDto getUserById(Long userId) {
        // 参数校验
        if (ObjectUtil.isEmpty(userId)) {
            log.warn("获取用户信息失败，用户ID不能为空: userId={}", userId);
            return null;
        }

        try {
            UserInfoPO userPO = userInfoMapper.selectById(userId);
            if (userPO == null) {
                log.warn("未找到用户信息: userId={}", userId);
                return null;
            }

            // 转换为DTO
            UserInfoDto userDto = BeanUtil.copyProperties(userPO, UserInfoDto.class);
            log.debug("获取用户信息成功: userId={}, nickname={}", userId, userDto.getNickName());
            return userDto;
        } catch (Exception e) {
            log.error("获取用户信息失败: userId={}, 错误: {}", userId, e.getMessage(), e);
            return null;
        }
    }

    @Override
    public String getUserNickname(Long userId) {
        // 参数校验
        if (ObjectUtil.isEmpty(userId)) {
            log.warn("获取用户昵称失败，用户ID不能为空: userId={}", userId);
            return "匿名用户";
        }

        try {
            UserInfoPO userPO = userInfoMapper.selectById(userId);
            if (userPO == null) {
                log.warn("未找到用户信息: userId={}", userId);
                return "匿名用户";
            }

            String nickname = userPO.getNickName();
            if (StrUtil.isBlank(nickname)) {
                // 如果昵称为空，返回默认昵称
                nickname = "用户" + userId;
                log.debug("用户昵称为空，使用默认昵称: userId={}, nickname={}", userId, nickname);
            }

            log.debug("获取用户昵称成功: userId={}, nickname={}", userId, nickname);
            return nickname;
        } catch (Exception e) {
            log.error("获取用户昵称失败: userId={}, 错误: {}", userId, e.getMessage(), e);
            return "匿名用户";
        }
    }

    @Override
    public String getUserAvatar(Long userId) {
        // 参数校验
        if (ObjectUtil.isEmpty(userId)) {
            log.warn("获取用户头像失败，用户ID不能为空: userId={}", userId);
            return "/static/default-avatar.png";
        }

        try {
            UserInfoPO userPO = userInfoMapper.selectById(userId);
            if (userPO == null) {
                log.warn("未找到用户信息: userId={}", userId);
                return "/static/default-avatar.png";
            }

            String avatarUrl = userPO.getAvatarUrl();
            if (StrUtil.isBlank(avatarUrl)) {
                // 如果头像URL为空，返回默认头像
                avatarUrl = "/static/default-avatar.png";
                log.debug("用户头像为空，使用默认头像: userId={}", userId);
            }

            log.debug("获取用户头像成功: userId={}, avatarUrl={}", userId, avatarUrl);
            return avatarUrl;
        } catch (Exception e) {
            log.error("获取用户头像失败: userId={}, 错误: {}", userId, e.getMessage(), e);
            return "/static/default-avatar.png";
        }
    }

    @Override
    public String getUserTitle(Long userId) {
        // 参数校验
        if (ObjectUtil.isEmpty(userId)) {
            log.warn("获取用户称号失败，用户ID不能为空: userId={}", userId);
            return "读者";
        }

        try {
            UserInfoPO userPO = userInfoMapper.selectById(userId);
            if (userPO == null) {
                log.warn("未找到用户信息: userId={}", userId);
                return "读者";
            }

            String title = userPO.getTitle();
            if (StrUtil.isBlank(title)) {
                // 如果称号为空，返回默认称号（根据数据库默认值）
                title = "初级书虫";
                log.debug("用户称号为空，使用默认称号: userId={}, title={}", userId, title);
            }

            log.debug("获取用户称号成功: userId={}, title={}", userId, title);
            return title;
        } catch (Exception e) {
            log.error("获取用户称号失败: userId={}, 错误: {}", userId, e.getMessage(), e);
            return "读者";
        }
    }
}
